/**
 * Funciones que se utilizan en varios proyctos
**/

/**
 * Funcion que selecciona (O desselecciona) varios checkbox dependiendo del
 * estado de otro checkbox
 * 
 * @param {string} strSelectorChecar Selector (Con todo y . o #, de preferencia un ID con #id_nombre) que se verificara
 * @param {string} strSelectorPoner  Selector (Con todo y . o #, de preferencia una clase con .nombre_clase) a la cual se afectaran los selects
 */
function SelectAllCheckboxesComun(strSelectorChecar, strSelectorPoner) {
  $(strSelectorPoner).prop('checked', $(strSelectorChecar).prop("checked"));
}

/**
 * Función que inicializa algunos plugins de jquery
 */
$(function() {
  // Poner el formato currency en todos los elementos de clase 'ClaseCurrency'
  $('.ClaseCurrency'   ).formatCurrency  ();
  $('.DialogoTabs'     ).tabs            ();
  $('.Dialogo'         ).dialog({"autoOpen": false, "modal": true, "width": 550});
  $(':button'          ).addClass("ui-button ui-state-focus ui-corner-all");
  $(':submit'          ).addClass("ui-button ui-state-focus");
  $(':file'            ).addClass("ui-button ui-state-focus ui-corner-all");
  
  $('#gMostrarOcultarTablaMenuLateral').click(function() {
    $('#gTamlaMenuLateral').toggle();
  });
  
  $(".UpperCase").keyup(function() {
    this.value = this.value.toUpperCase();
  });
  
  $('.ClaseDate'       ).datetimepicker({
    dateFormat: "yy-mm-dd", 
    timeFormat: "hh:mm:ss", 
    numberOfMonths: 3, 
    hourGrid: 4, 
    minuteGrid: 10,
    stepHour: 1,
    stepMinute: 5
  });
  
  $('.ClaseDateOnly'       ).datetimepicker({
    dateFormat: "yy-mm-dd", 
    numberOfMonths: 3
  });
  
  $("ul.subnav").parent().append("<span></span>"); //Only shows drop down trigger when js is enabled (Adds empty span tag after ul.subnav*)
  $("ul.topnav li span").click(function() { //When trigger is clicked...
    //Following events are applied to the subnav itself (moving subnav up and down)
    $(this).parent().find("ul.subnav").slideDown('fast').show(); //Drop down the subnav on click
    $(this).parent().hover(function() {
    }, function(){
      $(this).parent().find("ul.subnav").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
    });
    //Following events are applied to the trigger (Hover events for the trigger)
    }).hover(function() {
      $(this).addClass("subhover"); //On hover over, add class "subhover"
    }, function(){  //On Hover Out
      $(this).removeClass("subhover"); //On hover out, remove class "subhover"
  });
  
});

/**
 * Funcion que verifica si lo que se esta pasando es un correo
 * 
 * @param {string} strEmail Valor del EMAIL a checar
 */
function IsEmail(strEmail) {
  var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  return regex.test(strEmail);
}

/**
 * Funcion que verifica si lo que se esta pasando es una fecha
 */
function IsDate(strDate) {
  var regex = /^\d{4}\-\d{2}\-\d{2}$/;
  return regex.test(strDate);
}

/**
 * Función que agrega un colorpicker a una estructura de la siguiente forma:
 * <div class="colorSelector" id="#id_div1#"><input type="hidden" name="#name1#" id="#id_inp1#" /><div style="background-color: ##color#"></div></div>
 */
function AgregarColorPicker(strIdDiv, strIdInp, strColor) {
  $("#" + strIdDiv).ColorPicker({
    color: '#' + strColor,
    onShow: function (colpkr) {
      $(colpkr).fadeIn(500);
      return false;
    },
    onHide: function (colpkr) {
      $(colpkr).fadeOut(500);
      return false;
    },
    onSubmit: function(hsb, hex, rgb, el) {
//      $(strIdInp).val(hex);
      document.getElementById(strIdInp).value = hex;
      $(el).ColorPickerHide();
    },
    onChange: function (hsb, hex, rgb) {
      document.getElementById(strIdInp).value = hex;
      // color_selector-inp-1-color
      // color_selector-inp-1-color
      $(strIdInp).val(hex);
      $('#' + strIdDiv + ' div').css('backgroundColor', '#' + hex);
    }
  });
}

/**
 * Función que crea un dialogo desde un div
 *
 * @param strIdDialogo     Id del div
 * @param strNombreDialogo Titulo del dialogo
 * @param intTotalWidth    Width del dialogo, o no pasar para que se ponga el default
 */
function AbrirDialogo(strIdDialogo, strNombreDialogo, intTotalWidth) {
  if(intTotalWidth == undefined) {
//    $('#' + strIdDialogo).dialog({"modal": true});
  } else {
    $('#' + strIdDialogo).dialog({width: intTotalWidth});
  }
  $('#' + strIdDialogo).dialog('open').dialog('option', 'title', strNombreDialogo);
}

/**
 * Variables para la pregunta que se muestra con un SI o un NO
 *
 * Contendrán la función que se llamará cuando se pulse SI y cuando se pulse NO.
 * Si alguna no contiene función, no se llamará
 */
var GfncFuncionSi = '';
var GfncFuncionNo = '';

/**
 * Función que mostrará un dialogo con las preguntas "SI" y "NO", y puede
 * ejecutar alguna función dependiendo del boton que se elija.
 *
 * Se necesita que exista un div con el siguiente formato:
 *
 * <div id="dialogComboPregunta" title="Alertas">
 *   <div>
 *     <div id="dialogComboPreguntaMensaje">Poner pregunta aqui</div>
 *     <div>
 *       <div style="float:left;">
 *         <input type="button" value="Si" onclick="SiApretado()" class='ui-button ui-corner-all ui-state-focus' />
 *       </div>
 *       <div style="float:right;">
 *         <input type="button" value="No" onclick="NoApretado()" class='ui-button ui-corner-all ui-state-focus' />
 *       </div>
 *     </div>
 *   </div>
 * </div>
 *
 * @param strPregunta   Pregunta que se realizará
 * @param fncFuncionSi  Función que se ejecutará cuando den click en SI
 * @param fncFuncionNo  Función que se ejecutará cuando den click en NO
 * @param intTotalWidth Parametro que dirá cual es el ancho del dialogo, o no pasar para poner el default de 300
 */
function MostrarPregunta(strPregunta, fncFuncionSi, fncFuncionNo, intTotalWidth) {
  if(intTotalWidth == undefined) {
    intTotalWidth = 300;
  } else {
    intTotalWidth = intTotalWidth - 0;
  }

  if(fncFuncionSi == undefined) {
    GfncFuncionSi = '';
  } else {
    GfncFuncionSi = fncFuncionSi;
  }

  if(fncFuncionNo == undefined) {
    GfncFuncionNo = '';
  } else {
    GfncFuncionNo = fncFuncionNo;
  }

  $('#dialogComboPreguntaMensaje').html(strPregunta);
  $('#dialogComboPregunta'       ).dialog({width: intTotalWidth});
  $('#dialogComboPregunta'       ).dialog('open');
}

/**
 * Función que se ejecutará si se presionó el botón "SI".
 *
 * Si existe una función que deba ser ejecutada, se ejecutará antes de cerrar
 * el dialogo.
 */
function SiApretado() {
  if(GfncFuncionSi != '') {
    GfncFuncionSi();
  }
  $('#dialogComboPregunta').dialog('close');
}

/**
 * Función que se ejecutará si se presionó el botón "NO".
 *
 * Si existe una función que deba ser ejecutada, se ejecutará antes de cerrar
 * el dialogo.
 */
function NoApretado() {
  if(GfncFuncionNo != '') {
    GfncFuncionNo();
  }
  $('#dialogComboPregunta').dialog('close');
}

/**
 * Función que formatea un numero para que tenga el formato de moneda
 *
 * @param num Numero a formatear
 */
function formatCurrency(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num)) {
    num = "0";
  }
  sign = (num == (num = Math.abs(num)));
  num = Math.floor(num * 100 + 0.50000000001);
  cents = num % 100;
  num = Math.floor(num / 100).toString();
  if(cents < 10) {
    cents = "0" + cents;
  }
  for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
    num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
  }
  return ('$' + ((sign) ? '' : '(') + num + '.' + cents + ((sign) ? '' : ')'));
}

/**
 * Función que abre una URL en una nueva ventana
 */
function AbrirVentana(strURL) {
  window.open(strURL, '_blank', 'left=100,top=100,height=500,width=800,resizable=1,scrollbars=1');
}

/**
 * Función para salir del sistema
 */
function cerrar_sesion() {
  var enlace = "index.php?option=salir";
  window.open(enlace, '', 'width=400,height=200');
}

/**
 * Función para ocultar un div
 */
function cerrar_div() {
  document.getElementById('overMarco').style.visibility="hidden";
}
